本篇是商品房网签平台总结系列的Part2-CSS,内容包括box-sizing、媒体查询。
全部项目请戳->>>>> https://github.com/honey3go/realEstate
box-sizing
之前在仿网易云音乐PC的时候,就发现了box-sizing这个属性,但是没有深入研究。后来在element ui中发现了这个属性的大量使用,然后又去看了bootstrap发现也是如此,这回彻底引起了我的注意。这个不起眼的属性,会让你的布局思路更清晰,在自适应或响应式布局中用处灰常大。
box-sizing是CSS3新增的属性,它可以重新定义盒模型。我们知道,在默认的盒模型中,元素的width和height是指内容区的宽高,不包括padding、border和margin,元素实际宽度=width+左右padding+左右border+左右margin,高度同理。然而通过设置box-sizing:border-box,我们可以将width设置为border以内的全部宽度,此时元素的实际宽度=width+左右margin。
语法
box-sizing: content-box | border-box | inherit;
栗子
我们将html和body元素的宽高调整为浏览器窗口的宽高,然后新建一个div元素,赋值padding 50px,100%的宽和50%的高。
|
|
效果:
我们看到,body的width*height是900x600.8,div是900x300.4。注意横向已经出现滚动条。
然后我们使用box-sizing属性,将其设置为border-box,然后我们发现:
div的width*height变为800x200。注意此次并没有滚动条,div的width+padding刚好等于body元素的width。
应用
box-sizing可以用来做什么呢?
box-sizing提供了一种优雅的方式在自适应布局和响应式布局。
自适应高度
对于传统的方法,实现一个padding固定、width自适应、实际宽度等于父元素width的div很容易:
然而应用在高度上却并不简单,原因是高度不会自动填满父元素,并且纵向的margin、border、padding,当以百分比定义时,它相对的是父元素的width而不是height。
常用的解决办法:
这种方法的原理是利用绝对定位,强行将子元素的顶部和底部与父元素对齐。
下面让我们看看利用box-sizing的解决方式:
是不是优雅多了?并且不需要使用绝对定位产生脱离文档流的元素。
在bootstrap和element ui中的应用
bootstrap和element ui都是栅格式布局系统,他们的实现思路也是一致的:
将整个页面中的一行横向等分为12个格子(element ui是24个),元素的宽度是相对于格子计算的。比如一行中并排包含两个元素,他们的宽度比是1:3,那么在bootstrap中,他们的宽度就是一个占3个格子的宽度,一个占9个格子的宽度。
除了栅格布局系统,其他很多元素也用到了box-sizing这个属性。
我猜想利用box-sizing的原因是:
- 元素的实际宽度只与页面宽度有关,用户手动改变元素padding或border时,不会影响到元素的实际宽度,这样使得布局表现更稳定。
- IE6以前的默认盒子模型就是padding+border+width,可能是考虑到了兼容问题。
媒体查询@media
媒体查询可以针对不同的媒体类型、不同的屏幕尺寸设置定义不同的样式。我理解的媒体查询就像一个针对CSS样式的if语句,当条件满足XXXX时,应用PPPP样式。
媒体查询主要应用于响应式布局中,对不同屏幕大小应用不同的样式。它也可以应用在其他场景上,比如打印页面。
语法
@media mediatype and|not|only (media feature) {
CSS-Code;
}
应用
本次的项目有打印页面的需求,也要求做移动端APP,因此我们在这两个方向上用了媒体查询。
打印页面
打印页面通常是打印页面的一部分而非全体,因此我们需要在打印时,显示需要打印的元素,隐藏不需要打印的元素。
打印时需要隐藏的元素加上一个css类noprint,点击打印按钮时,这些元素就会应用noprint的样式,隐藏显示。
响应式页面
无论是PC端不同尺寸的浏览器窗口,还是移动端不同页面尺寸的屏幕,通过媒体查询都可以检测到。
这条媒体查询的含义是:对于屏幕宽度在375px以下的手机,具有left-wrap类的元素,其宽度是64px。